
/**
 * Algoritmos y Estructurade Datos 11 de julio del 2013 Ejericio No. 1 Clae
 * principal para la ejecucion en la line de comando VICTOR FUENTES 12298
 * SAMANTHA CATÚN 12382 YUCELY BEB 12537
 */
import java.util.Scanner;

public class Driver {
        public static void main(String[] args)
    {
        //objeto de ingreso scanner
        Scanner ingreso = new Scanner(System.in);
        Scanner ingreso2 = new Scanner(System.in);
        Scanner ingreso3 = new Scanner(System.in);
        Scanner ingreso4 = new Scanner(System.in);
        int in = 0;
        int opcion;
        int opMenu;
        int largo = 0;//variable para el ingreso del largo
        int i, j;//variable a usar para diferentes propositos
        int prueba = 0;//variable ingreso despues de configurar el candado
        boolean error = true;//variable para saber prueba esta en formato o no
        boolean exit = false;//variable para saber si sale del programa o no
        boolean verS = true;
        String hi = "0";//variable para comparar con reset
        thelock candado;
        thelock1 candado1;
        
        System.out.println("+---------------------------------+");
        System.out.println("\nAlgoritmos y Estructura de Datos");
        System.out.println("\nEjercicio No. 1, Candado");
        System.out.println("+---------------------------------+\n\n\n");
        try
        {
        while(verS== true)
        {
        System.out.println("-----------------------------------");
        System.out.println("Seleccione una opción");
        System.out.println("1. Utilizar candado");
        System.out.println("2. Salir ");
        
            opMenu = ingreso4.nextInt();
            if (opMenu == 1)
            {
               System.out.println("1. Yale");
               System.out.println("2. Philips");
                System.out.println("3. Volver al menú principal");
                
            opcion = ingreso3.nextInt();
            try
            {
            if (opcion == 1) {
                System.out.println("\nIngrese el largo de la contraseña: ");
                try {
                    largo = ingreso.nextInt();
                    if (largo > 0) {

                        candado1 = new thelock1(largo);
                        i = 0;

                        while (i <largo) {//ciclo para pedir la cantidad de ingreso, igual al largo de la lista-1
                            System.out.println("\nIngrese digito " + i + ": ");
                            in = ingreso.nextInt();

                            candado1.ingreso(i, in);
                            i++;
                        }
                        //System.out.println(candado1);              
                    } else {
                        System.out.println("\nError, se usará comfiguración predeterminada");
                        candado1 = new thelock1();
                        //System.out.println(candado1);
                    }


                } catch (Exception e) {
                    System.out.println("\nError, se usará  comfiguración predeterminada");
                    candado1 = new thelock1();
                    //System.out.println(candado1);
                }

                //System.out.println(candado1);
                //continuacion del codigo para abrir el candado1
                while (exit == false) {
                    System.out.println("\nEl candado1 esta cerrado, escriba reset si ingreso un");
                    System.out.println("\ndigito erroneo, tendrá que volver a escribr su contraseña.");
                    i = 0;//reset de la variable i
                    while (i < candado1.getLargo()) {
                        //System.out.println("alerta");
                        error = true;//actualizar error para que entre a ciclo   
                        while (error == true) {
                            try {
                                System.out.println("\nIngrese su contraseña, indice " + i + ":");
                                hi = ingreso2.nextLine();//revisar si ingreso reset, esto reinicia el ciclo
                                // System.out.println("\n-------------------------------------");
                                // System.out.println(hi);
                                // System.out.println("\n-----------------------------------" );


                                prueba = Integer.parseInt(hi);
                                candado1.setIndice(i);
                                candado1.press(prueba);//ingreso de (valor a probar, indice con el que se compara en la lista)
                                error = false;



                                //}
                            } catch (Exception a) {
                                if (hi.equals("reset")) {
                                    System.out.println("\nSe reiniciara el ingreso de la contraseña");
                                    i = -1;
                                    error = false;
                                    //ingreso2.next();
                                } else {
                                    System.out.println("\nError de ingreso");
                                    error = true;
                                    //i=i-1;
                                    //ingreso2.next();
                                }


                            }//fin del catch



                        }//fin del while(error==true)



                        i++;//actualizacion del indice con el que se comparan los ingresos con los valores de la contraseña guardada
                    }//fin de ciclo para ingresar la constraseña
                    //-------------------------------------------------
                    //inicio para validacion de contraseña

                    System.out.println("\nComprobando contraseña...");
                    if (candado1.isLocked() == false) {
                        candado1.lock();//llamada al metodo para hacer variable estado=false

                        System.out.println("\nCandado Abierto");
                        exit = true;//salir de ciclo de repeticion
                    } else {
                        System.out.println("\nContraseña incorrecta");
                        exit = false;//seguir pidiendo la contraseña
                        candado1.setLlave();//actualiza llave para nuevo intento
                    }
                }

            }
            if (opcion == 2) {

                System.out.println("\nIngrese el largo de la contraseña: ");
                try {
                    largo = ingreso.nextInt();
                    if (largo > 0) {

                        candado = new thelock(largo);
                        j = 0;

                        while (j< largo) {//ciclo para pedir la cantidad de ingreso, igual al largo de la lista-1
                            System.out.println("\nIngrese digito " + j + ": ");
                            in = ingreso.nextInt();

                            candado.ingreso(j, in);
                            j++;
                        }
                        //System.out.println(candado);              
                    } else {
                        System.out.println("\nError, se usará comfiguración predeterminada");
                        candado = new thelock();
                        //System.out.println(candado);
                    }


                } catch (Exception e) {
                    System.out.println("\nError, se usará  comfiguración predeterminada");
                    candado = new thelock();
                    //System.out.println(candado);
                }

                //System.out.println(candado);
                //continuacion del codigo para abrir el candado
                while (exit == false) {
                    System.out.println("\nEl candado esta cerrado, escriba reset si ingreso un");
                    System.out.println("\ndigito erroneo, tendrá que volver a escribr su contraseña.");
                    j = 0;//reset de la variable i
                    while (j < candado.getLargo()) {
                        //System.out.println("alerta");
                        error = true;//actualizar error para que entre a ciclo   
                        while (error == true) {
                            try {
                                System.out.println("\nIngrese su contraseña, indice " + j + ":");
                                hi = ingreso2.nextLine();//revisar si ingreso reset, esto reinicia el ciclo
                                // System.out.println("\n-------------------------------------");
                                // System.out.println(hi);
                                // System.out.println("\n-----------------------------------" );


                                prueba = Integer.parseInt(hi);
                                candado.setIndice(j);
                                candado.press(prueba);//ingreso de (valor a probar, indice con el que se compara en la lista)
                                error = false;



                                //}
                            } catch (Exception a) {
                                if (hi.equals("reset")) {
                                    System.out.println("\nSe reiniciara el ingreso de la contraseña");
                                    j = -1;
                                    error = false;
                                    //ingreso2.next();
                                } else {
                                    System.out.println("\nError de ingreso");
                                    error = true;
                                    //i=i-1;
                                    //ingreso2.next();
                                }


                            }//fin del catch



                        }//fin del while(error==true)



                        j++;//actualizacion del indice con el que se comparan los ingresos con los valores de la contraseña guardada
                    }//fin de ciclo para ingresar la constraseña
                    //-------------------------------------------------
                    //inicio para validacion de contraseña

                    System.out.println("\nComprobando contraseña...");
                    if (candado.isLocked() == false) {
                        candado.lock();//llamada al metodo para hacer variable estado=false

                        System.out.println("\nCandado Abierto");
                        exit = true;//salir de ciclo de repeticion
                    } else {
                        System.out.println("\nContraseña incorrecta");
                        exit = false;//seguir pidiendo la contraseña
                        candado.setLlave();//actualiza llave para nuevo intento
                    }
                }


            }
            } catch(Exception e)
            {
            System.out.println("\nError, se usará  comfiguración predeterminada");
            candado = new thelock();
            //System.out.println(candado);
            }
            if (opcion == 3)
            {
                 verS=true; 
            }
            else
            {
                System.out.println("\nIngrese una opción correcta\n\n");
            }
            }
            if (opMenu == 2)
            {
                
                //despedida final----------------

                System.out.println("\n--------------------------------------");
                System.out.println("\n---Adios-----");
                verS=false;
             
            }

    }
        
} catch (Exception e) {
            System.out.println("Ingreso inválido"); 
        } 
}
}